﻿import type { RequestOptions } from '@@/plugin-request/request';
import type { RequestConfig } from '@umijs/max';
import { message, notification } from 'antd';

// 错误处理方案： 错误类型
enum ErrorShowType {
  SILENT = 0,
  WARN_MESSAGE = 1,
  ERROR_MESSAGE = 2,
  NOTIFICATION = 3,
  REDIRECT = 9,
}
// 与后端约定的响应数据格式
interface ResponseStructure {
  success: boolean;
  data: any;
  errorCode?: number;
  errorMessage?: string;
  showType?: ErrorShowType;
}

/**
 * @name 错误处理
 * pro 自带的错误处理， 可以在这里做自己的改动
 * @doc https://umijs.org/docs/max/request#配置
 */
export const requestConfig: RequestConfig = {
  // 这里为我们请求的后端地址
  baseURL: 'http://localhost:8101',
  withCredentials: true,
  // 错误处理： umi@3 的错误处理方案。
  errorConfig: {
    // 错误抛出
    errorThrower: (res) => {
      const {success, data, errorCode, errorMessage, showType} =
        res as unknown as ResponseStructure;
      if (!success) {
        const error: any = new Error(errorMessage);
        error.name = 'BizError';
        error.info = {errorCode, errorMessage, showType, data};
        throw error; // 抛出自制的错误
      }
    },

    // 请求拦截器
    requestInterceptors: [
      (config: RequestOptions) => {
        // 拦截请求配置，进行个性化处理。
        const url = config?.url?.concat('?token = 123');
        return {...config, url};
      },
    ],

    // 响应拦截器
    responseInterceptors: [
      (response) => {
        // 拦截响应数据，进行个性化处理
        const {data} = response as unknown as ResponseStructure;

        if (data.code !== 0) {
          message.error('请求失败！' + data.message);
        }
        return response;
      },
    ],
  }
}
